{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Non-covalent interactions benchmark"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-01T23:12:06.663090Z",
"start_time": "2023-05-01T23:12:06.304474Z"
}
},
"outputs": [],
"source": [
"import pymolpro\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-01T23:12:06.665351Z",
"start_time": "2023-05-01T23:12:06.664237Z"
}
},
"outputs": [],
"source": [
"backend = 'local' # If preferred, change this to one of the backends in your ~/.sjef/molpro/backends.xml that is ssh-accessible\n",
"project_name = 'Non-covalent interactions benchmark'\n",
"parallel = None # how many jobs to run at once"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-01T23:12:06.667708Z",
"start_time": "2023-05-01T23:12:06.666512Z"
}
},
"outputs": [],
"source": [
"methods = {\"HF\": \"df-hf\", \"MP2\": \"df-mp2\", \"LMP2\": \"df-lmp2\", }\n",
"bases = ['aug-cc-pVDZ', 'aug-cc-pVTZ', 'aug-cc-pVQZ']"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-01T23:12:06.671134Z",
"start_time": "2023-05-01T23:12:06.668910Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"db = pymolpro.database.load(\"GMTKN55_S22\").subset('small')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-01T23:12:08.135297Z",
"start_time": "2023-05-01T23:12:06.673321Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"results = {}\n",
"for method in methods:\n",
" results[method] = {}\n",
" for basis in bases:\n",
" results[method][basis] = pymolpro.database.run(db, method=methods[method], basis=basis, location=project_name,\n",
" backend=backend, parallel=parallel)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-01T23:12:08.138419Z",
"start_time": "2023-05-01T23:12:08.136538Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"for method in methods:\n",
" for result in pymolpro.database.basis_extrapolate(results[method].values(),results['HF'].values()):\n",
" results[method][result.basis]=result\n",
" for basis in results[method]:\n",
" if basis not in bases: bases.append(basis)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-02T12:26:47.382660Z",
"start_time": "2023-05-02T12:26:47.371530Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" DF-HF/aug-cc-pVQZ | \n",
" DF-MP2/aug-cc-pVQZ | \n",
" DF-LMP2/aug-cc-pVQZ | \n",
"
\n",
" \n",
" \n",
" \n",
" MAD | \n",
" 6.08 | \n",
" 0.22 | \n",
" 0.54 | \n",
"
\n",
" \n",
" MAXD | \n",
" 7.52 | \n",
" 0.42 | \n",
" 0.79 | \n",
"
\n",
" \n",
" RMSD | \n",
" 6.30 | \n",
" 0.28 | \n",
" 0.58 | \n",
"
\n",
" \n",
" MSD | \n",
" -6.08 | \n",
" 0.22 | \n",
" -0.54 | \n",
"
\n",
" \n",
" STDEVD | \n",
" 2.03 | \n",
" 0.21 | \n",
" 0.26 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" DF-HF/aug-cc-pVQZ DF-MP2/aug-cc-pVQZ DF-LMP2/aug-cc-pVQZ\n",
"MAD 6.08 0.22 0.54\n",
"MAXD 7.52 0.42 0.79\n",
"RMSD 6.30 0.28 0.58\n",
"MSD -6.08 0.22 -0.54\n",
"STDEVD 2.03 0.21 0.26"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.set_option('display.precision', 2)\n",
"method_errors = pymolpro.database.analyse([results[method]['aug-cc-pVQZ'] for method in methods], db, 'kJ/mol')[\n",
" 'reaction statistics']\n",
"with open(project_name + '.method_errors.tex', 'w') as tf:\n",
" tf.write('\\\\ifx\\\\toprule\\\\undefined\\\\def\\\\toprule{\\\\hline\\\\hline}\\n\\\\def\\\\midrule{\\\\hline}\\n\\\\def\\\\bottomrule{\\\\hline\\\\hline}\\\\fi') # or \\usepackage{booktabs}\n",
" tf.write(method_errors.style.format(precision=2).to_latex(hrules=True,multicol_align='c',caption='Method errors'))\n",
"method_errors"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-02T06:43:48.652936Z",
"start_time": "2023-05-02T06:43:48.649242Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"results\n",
"[{'method': ['hf', 'df-hf'], 'basis': 'aug-cc-pVQZ', 'unit': 'Hartree', 'molecule energies': {'02': -152.137348921515, '08': -80.4318272687273, '01': -112.450005978623, '01a': -56.2239391353761, '02a': -76.0660246769283, '08a': -40.2162104675589}}, {'method': ['hf', 'df-mp2'], 'basis': 'aug-cc-pVQZ', 'unit': 'Hartree', 'molecule energies': {'02': -152.711896534593, '08': -80.8555325153533, '01': -112.960568865909, '01a': -56.4777418852842, '02a': -76.3518936483437, '08a': -40.4273483053424}}, {'method': ['hf', 'df-lmp2'], 'basis': 'aug-cc-pVQZ', 'unit': 'Hartree', 'molecule energies': {'02': -152.709533151809, '08': -80.8536174728202, '01': -112.958067503889, '01a': -56.4766434227825, '02a': -76.3509422922261, '08a': -40.4264399856976}}]\n",
"reaction energies\n",
" DF-HF/aug-cc-pVQZ DF-MP2/aug-cc-pVQZ DF-LMP2/aug-cc-pVQZ\n",
"2 5.30e-03 8.11e-03 7.65e-03\n",
"1 2.13e-03 5.09e-03 4.78e-03\n",
"8 -5.94e-04 8.36e-04 7.38e-04\n",
"reaction energy deviations\n",
" DF-HF/aug-cc-pVQZ DF-MP2/aug-cc-pVQZ DF-LMP2/aug-cc-pVQZ\n",
"2 -2.65e-03 1.59e-04 -3.02e-04\n",
"1 -2.87e-03 9.23e-05 -2.12e-04\n",
"8 -1.43e-03 -3.92e-06 -1.02e-04\n",
"reaction statistics\n",
" DF-HF/aug-cc-pVQZ DF-MP2/aug-cc-pVQZ DF-LMP2/aug-cc-pVQZ\n",
"MAD 2.32e-03 8.50e-05 2.05e-04\n",
"MAXD 2.87e-03 1.59e-04 3.02e-04\n",
"RMSD 2.40e-03 1.06e-04 2.21e-04\n",
"MSD -2.32e-03 8.24e-05 -2.05e-04\n",
"STDEVD 7.72e-04 8.18e-05 1.00e-04\n",
"molecule energies\n",
" DF-HF/aug-cc-pVQZ DF-MP2/aug-cc-pVQZ DF-LMP2/aug-cc-pVQZ\n",
"02 -152.14 -152.71 -152.71\n",
"08 -80.43 -80.86 -80.85\n",
"01 -112.45 -112.96 -112.96\n",
"01a -56.22 -56.48 -56.48\n",
"02a -76.07 -76.35 -76.35\n",
"08a -40.22 -40.43 -40.43\n",
"molecule violin plot\n",
"None\n",
"reaction violin plot\n",
"Figure(600x600)\n"
]
}
],
"source": [
"for key, table in pymolpro.database.analyse([results[method]['aug-cc-pVQZ'] for method in methods], db).items():\n",
" print(key)\n",
" print(table)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-02T12:25:56.388995Z",
"start_time": "2023-05-02T12:25:56.377711Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" DF-HF/aug-cc-pVQZ | \n",
" DF-MP2/aug-cc-pVQZ | \n",
" DF-LMP2/aug-cc-pVQZ | \n",
"
\n",
" \n",
" \n",
" \n",
" 2 | \n",
" -6.96 | \n",
" 0.42 | \n",
" -0.79 | \n",
"
\n",
" \n",
" 1 | \n",
" -7.52 | \n",
" 0.24 | \n",
" -0.56 | \n",
"
\n",
" \n",
" 8 | \n",
" -3.76 | \n",
" -0.01 | \n",
" -0.27 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" DF-HF/aug-cc-pVQZ DF-MP2/aug-cc-pVQZ DF-LMP2/aug-cc-pVQZ\n",
"2 -6.96 0.42 -0.79\n",
"1 -7.52 0.24 -0.56\n",
"8 -3.76 -0.01 -0.27"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.set_option('display.precision', 2)\n",
"method_errors = pymolpro.database.analyse([results[method]['aug-cc-pVQZ'] for method in methods], db, 'kJ/mol')[\n",
" 'reaction energy deviations']\n",
"method_errors"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-02T12:23:16.827929Z",
"start_time": "2023-05-02T12:23:16.813556Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" DF-LMP2/aug-cc-pVDZ | \n",
" DF-LMP2/aug-cc-pVTZ | \n",
" DF-LMP2/aug-cc-pVQZ | \n",
" DF-LMP2/aug-cc-pV[23]Z | \n",
" DF-LMP2/aug-cc-pV[34]Z | \n",
"
\n",
" \n",
" \n",
" \n",
" MAD | \n",
" 1.43 | \n",
" 4.05 | \n",
" 0.54 | \n",
" 4.86 | \n",
" 2.24 | \n",
"
\n",
" \n",
" MAXD | \n",
" 2.23 | \n",
" 10.63 | \n",
" 0.79 | \n",
" 13.76 | \n",
" 6.46 | \n",
"
\n",
" \n",
" RMSD | \n",
" 1.64 | \n",
" 6.18 | \n",
" 0.58 | \n",
" 7.95 | \n",
" 3.73 | \n",
"
\n",
" \n",
" MSD | \n",
" -1.21 | \n",
" -4.05 | \n",
" -0.54 | \n",
" -4.86 | \n",
" 2.07 | \n",
"
\n",
" \n",
" STDEVD | \n",
" 1.36 | \n",
" 5.71 | \n",
" 0.26 | \n",
" 7.71 | \n",
" 3.81 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" DF-LMP2/aug-cc-pVDZ DF-LMP2/aug-cc-pVTZ DF-LMP2/aug-cc-pVQZ \\\n",
"MAD 1.43 4.05 0.54 \n",
"MAXD 2.23 10.63 0.79 \n",
"RMSD 1.64 6.18 0.58 \n",
"MSD -1.21 -4.05 -0.54 \n",
"STDEVD 1.36 5.71 0.26 \n",
"\n",
" DF-LMP2/aug-cc-pV[23]Z DF-LMP2/aug-cc-pV[34]Z \n",
"MAD 4.86 2.24 \n",
"MAXD 13.76 6.46 \n",
"RMSD 7.95 3.73 \n",
"MSD -4.86 2.07 \n",
"STDEVD 7.71 3.81 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.set_option('display.precision', 2)\n",
"basis_errors = pymolpro.database.analyse([results['LMP2'][basis] for basis in bases], db, 'kJ/mol')[\n",
" 'reaction statistics']\n",
"with open(project_name + '.basis_errors.tex', 'w') as tf:\n",
" tf.write('\\\\ifx\\\\toprule\\\\undefined\\\\def\\\\toprule{\\\\hline\\\\hline}\\n\\\\def\\\\midrule{\\\\hline}\\n\\\\def\\\\bottomrule{\\\\hline\\\\hline}\\\\fi') # or \\usepackage{booktabs}\n",
" tf.write(basis_errors.style.format(precision=2).to_latex(hrules=True,multicol_align='c',caption='Basis errors'))\n",
"basis_errors"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-02T06:43:58.105675Z",
"start_time": "2023-05-02T06:43:57.900086Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABc4AAAIlCAYAAADsVGvuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAXtZJREFUeJzt3XmUXHWZP/6nqpfq7pCN7IEQAi4sYRMcFh1JUAMoMCwCQUcIAgrIIsgXJ+PCMmJEFvmByOJAkB0VOayKMCyigCyCCGKEMRgICSGEpLP2VvX7g0nbTbbupLpu1a3X65w6h751696nquh+Uu/7qc8nUygUCgEAAAAAAERERDbpAgAAAAAAoJwIzgEAAAAAoAvBOQAAAAAAdCE4BwAAAACALgTnAAAAAADQheAcAAAAAAC6EJwDAAAAAEAXgnMAAAAAAOhCcA4AAAAAAF0IzoGKd+edd0Ymk4krr7xyjfs88MADkclk4uKLL45MJtOjW0T0aL+zzz67RM8UACpTb3v1SoVCIW6++ebYa6+9YvDgwdHQ0BBbbrllnHzyyTF79uxuj3/kkUd61LcfeeSRvnqaAFCW1qcPb7755p2986STTurcb+nSpTF58uT48Ic/HP37949+/frFtttuG9/97ndj6dKla63jW9/6VmQymRg/fvwq9+24446d59tvv/06t3etY023KVOm9PIVgZ7JFAqFQtJFAGyI9vb2GDNmTIwZMyaeeuqp1e7z+c9/Pn7xi1/EK6+8EnPmzOl230EHHRRbbrllXHjhhd2277bbbvHkk0+u8ZxHHnlkzJ49Ox577LH4l3/5l+I8GQBIod706tmzZ8ewYcMin8/H5z//+bjtttviiCOOiMMPPzwGDhwYL7zwQlxwwQWxfPnyuO+++zp7cHNzc/zlL39Z7bHfeOON+MIXvhCbbLJJPPvsszF48OA+e64AUG7Wpw9vvvnmse2228a3v/3tGDlyZGy++eYREbFw4cL4yle+EnvttVeMGzcustls/Pa3v43vf//78YlPfCIefPDB1R7/+eefj9122y0GDRoUQ4cOjRdffLHb/X/+859j6dKlcdBBB8XOO+8c99xzT0REPPfcc9HS0rLaY55yyinxzDPPxC9/+cs48MAD1+/FgbWoTboAgA1VW1sbRx55ZPzgBz+IF198cZWr1wsXLow77rgjDjjggBg7dmyMHTu22/25XC4GDRoUu+222yrHXt22iPca9MyZM+Oqq64SmgPAOvSmVw8bNiwiIs4///y47bbb4vvf/3584xvf6Nx3woQJcfjhh8euu+4aBx98cLz88svRv3//GDBgwGr7dktLS5x66qlRU1MTv/zlL4XmAFSd9enDERHDhg1bpbcOGjQobrvttm7bPvWpT0VLS0v84Ac/iL///e+xxRZbdLu/vb09jj766PjKV74Sf/rTn2L+/Pmr1LjddttFxHufz7vaaaedVvucLr744nj66adj6tSpQnP6jKlaoEK8+uqrcfTRR8cHP/jBaGpqik022ST233//+POf/9xtv+uuuy4ymUy89tpr3bav/Ppy168nFwqF+N73vhdjx46NhoaG2GWXXeKBBx6ICRMmxIQJE3pUV0tLS5x77rmx9dZbR0NDQwwZMiQmTpwYjz/+eOc++Xw+Lrvssthxxx2jsbGxM6S+66671nn8CRMmxPjx4+Oxxx6L3XbbLRobG2OTTTaJb3/729HR0dG53zHHHBMREdOnT1/lGLfcckusWLEivvSlL/XoOa3LDTfcEJdddlkcc8wx8eUvf7koxwSg8unVxevVra2tccEFF8TWW28dZ5555ir7jxgxIqZNmxazZ89e7fG6OvHEE+Opp56Kq6++Onbcccd1Ph8AKpM+nOxn5pWBe23tqmN0v//978eCBQvivPPOW+/jd/Xwww/HN77xjZg0aVJ897vfLcoxYXUE51Ah3nzzzRgyZEh8//vfj1//+tdx+eWXR21tbey6664xY8aM9TrmN7/5zfjmN78Z++yzT9x5551x/PHHx7HHHht/+9vfevT49vb22HfffeO//uu/Yr/99os77rgjrrvuuthjjz1i1qxZnftNmTIlTj311PjoRz8at912W9x6661xwAEHrPIPlTWZO3duTJ48Ob7whS/EnXfeGZ/73Ofiu9/9bpx66qmd+3zoQx+Kj3/843HjjTdGW1tbt8dPnz49Ntlkk9h77717dL61ee655+IrX/lKfPSjH43LL798g48HQHro1cXr1c8++2y8++67ccABB3SuO/J++++/f2Sz2bj//vvXWNcVV1wR1157bZx88snx7//+7z16LgBUJn24tJ+ZC4VCtLe3R3Nzc/z617+Oiy66KI444ojYbLPNuu33l7/8Jb773e/GFVdcERtttFGPj78ms2bNisMPPzw23XTTuOWWWyKbFW3ShwpARWpvby+0trYWPvjBDxZOO+20zu3Tp08vRERh5syZ3fZ/+OGHCxFRePjhhwuFQqGwYMGCQi6XKxx++OHd9nviiScKEVHYc88911nD9ddfX4iIwk9+8pM17vPb3/62EBGFb37zmz1+bl3tueeehYgo3Hnnnd22H3fccYVsNlv4xz/+0blt5XP/5S9/2bntxRdfXOf5x44dW/jsZz+7zlrefvvtwtixYwvDhg0rzJo1az2eDQDVRK9e/1596623FiKicOWVV6713CNGjChsu+22q73v97//faGurq7wr//6r4XW1tb1eWoAVDB9eMM+M48dO7Zw1FFHrfG8t9xySyEiOm9HH310oa2trds+HR0dhV133bVwxBFHdKt3Tb175XnX9Pl8+fLlhZ133rnQ2NhY+OMf/7jGY0CxuCwDFaK9vT2+973vxTbbbBP19fVRW1sb9fX18corr8TLL7/c6+M9+eST0dLSEocddli37bvttlvnoh8rdXR0RHt7e+ctn89HRMSvfvWraGhoWOvXuX71q19FRMRXv/rVNe6Tz+e7Hb/r18kiIvr37x8HHHBAt22f//znI5/Px29/+9vObYcddlj0798/rr322s5t1157bWQymTj66KPXeP6e6OjoiMmTJ8cbb7wRt912W4wZM2aDjgdA+ujVpe/VhUJhtSPS58yZE5/73Odi2LBh8bOf/Szq6up6fWwAKos+XNo+vPfee8fTTz8dDz30UJx33nlx++23xyGHHNL53CPem4f8lVdeiUsuuaRXx16T448/Pp599tm46qqr1jj3ORST4BwqxOmnnx7f/va348ADD4y77747/vCHP8TTTz8dO+ywQyxfvrzXx3vnnXci4r05Qt/v/du23HLLqKur67yde+65ERHx9ttvx+jRo9f61ai33347ampqYuTIkWvc59xzz+12/C233HKt9URE5/FWPo+IiKamppg8eXL8+te/jrlz50Z7e3vceOONseeee65yzN4688wz43/+53/i/PPPj4kTJ27QsQBIJ726uw3p1Su/5j1z5sw11rR06dKYP3/+KhezW1tb45BDDol33nknfvGLX6z1eQGQHvpwd339mXnw4MGxyy67xMSJE+M///M/4+qrr4677ror7rzzzoh4b0qV73znO3HWWWdFfX19LFy4MBYuXNh5YWHhwoW9el8uu+yy+OlPfxonnXRSfPGLX+xVrbC+Vp2xHyhLN954Yxx55JHxve99r9v2+fPnx6BBgzp/bmhoiIj3FiB5/35dDRkyJCIi3nrrrVXONXfu3G5X0O++++5uxxs9enREvLf4x+9+97vI5/Nr/IfAsGHDoqOjI+bOnRujRo1a7T5f/vKXY7/99uv8+f2raK+pxq7PY6VjjjkmfvKTn8T1118fH/rQh2LevHlx0UUXrfa8PXXLLbfExRdfHIcffnh8/etf36BjAZBeevWqNXZ9Hiv1pFfvvPPOsfHGG8ddd90V06ZNW+2o8rvuuivy+Xzstdde3baffPLJ8cQTT8SPf/zj2H333Vf7fABIH3141Rq7Po+V+uIzc0TEv/zLv0REdM7//ve//z2WL18ep556are51lcaPHhwnHrqqT0ajf7YY4/F17/+9fj4xz8eF1988QbXCj1lxDlUiEwms0pzvPfee2P27Nndtq1s3i+88EK37e9fjXvXXXeNXC4Xt912W7ftTz75ZPzjH//otm277baLXXbZpfO28h8B++67b6xYsSKuu+66Nda97777RsR7i3OtyejRo7sdf7vttut2/+LFi1ep/+abb45sNhuf+MQnVnle48ePj+nTp8f06dNj4MCBccghh6zx3OvywgsvxLHHHhvjx4+Pa665Zr2PA0D66dXF69X19fXx//7f/4uXX345LrjgglXqmTdvXkydOjUGDRoUU6ZM6dz+3//933H11VfH0UcfHSeccMIanw8A6aMPJ/OZeaWHH344IiI+8IEPRETEjjvuGA8//PAqtx122CE233zzePjhh+Okk05a53Fnz54dhx56aAwdOjR+/vOfm36NkjLiHCrEfvvtF9ddd11stdVWsf3228ezzz4bF1xwQWy66abd9vvoRz8aH/7wh+OMM86I9vb2GDx4cNxxxx3xu9/9rtt+G2+8cZx++ukxbdq0GDx4cBx00EHxxhtvxDnnnBOjRo3q0crURxxxREyfPj2OP/74mDFjRkycODHy+Xz84Q9/iK233jomT54c//qv/xpf/OIX47vf/W689dZbsd9++0Uul4vnnnsumpqa4uSTT17neYYMGRInnHBCzJo1Kz70oQ/FfffdFz/5yU/ihBNOWGXF7oiIL33pS3H66afHjBkz4itf+Uo0Njau8xyr8+6778aBBx4YLS0t8Y1vfCP+/Oc/r3a/YcOGbfBUMABUPr26uL36zDPPjOeffz6+8Y1vxJ/+9Kc4/PDDY+DAgfHCCy/EBRdcEG+99Vbcc889MXTo0IiIeOqpp+Kkk06KkSNHxpFHHhlPPvnkamvdcsstY9iwYet8TgBUFn24NJ+Zr7rqqnjsscdi0qRJMWbMmFi6dGk89thjcdlll8Uee+wR//Zv/xYREYMGDYoJEyas8vhBgwZFe3v7au97v9bW1jj44IPjrbfeiosuuihee+21eO2111bZb8CAAbHNNtv0+DlAjyW9OinQM++++27hmGOOKQwfPrzQ1NRU+PjHP1547LHHCnvuuecqq3n/7W9/K0yaNKkwYMCAwrBhwwonn3xy4d577+22QnihUCjk8/nCd7/73cKmm25aqK+vL2y//faFe+65p7DDDjsUDjrooB7VtXz58sJ3vvOdwgc/+MFCfX19YciQIYW99tqr8Pjjj3fu09HRUfjhD39YGD9+fKG+vr4wcODAwu677164++6713n8lStuP/LII4VddtmlkMvlCqNGjSr853/+5yordq/09ttvF+rr6wsRUXjqqafWeY41rdq9clX1dd3WttI4ANVDry5+r87n84UbbrihsOeeexYGDhzY2Xs//OEPF15++eVu+5511lk96tvTp0/v0esGQGXRh4vbh8eOHbvaz7q///3vC/vtt19h9OjRhfr6+kJTU1Nhhx12KPzXf/1XYenSpT2ud026fj6fOXNmj3r7+99fKJZMoVAo9HE2D1SQmTNnxlZbbRVnnXVW/Od//mfS5cSECRNi/vz58eKLLyZdCgCUhWrv1ccee2z89Kc/jdtvvz0OOOCAkpwTAFaqlj68+eabx5577hnXXHNNZLPZHo2w3xAdHR1RKBTiAx/4QIwfPz7uueeePj0f9ISpWqCK/elPf4pbbrkl9thjjxgwYEDMmDEjfvCDH8SAAQPimGOOSbo8AKh6evWqrrrqqnjrrbfisMMOi7vvvjs+/elPJ10SAClV7X34+uuvj+uvvz6++tWvxo9+9KM+PdfOO+8cf/rTnyIiYvz48X16LugpwTlUsX79+sUzzzwT11xzTSxcuDAGDhwYEyZMiPPOOy9GjBiRdHkAUPX06lXV1NTE3XffnXQZAFSBau7Dd999d7S0tERExPDhw/v8fDfffHMsW7YsIt6bBx3KgalaAAAAAACgi76doAgAAAAAACqM4BwAAAAAALoQnAMAAAAAQBcWBy2CfD4fb775ZvTv3z8ymUzS5QCQMoVCIRYvXhyjR4+ObNY17/WlXwPQ1/Ts4tCzAehLPe3XgvMiePPNN2PMmDFJlwFAyr3++uux6aabJl1GxdKvASgVPXvD6NkAlMK6+rXgvAj69+8fEe+92AMGDEi4GgDSprm5OcaMGdPZb1g/+jUAfU3PLg49G4C+1NN+LTgvgpVfHRswYICmDkCf8VXlDaNfA1AqevaG0bMBKIV19WuTrgEAAAAAQBeCcwAAAAAA6EJwDgAAAAAAXQjOAQAAAACgC8E5AAAAAAB0ITgHAAAAAIAuBOcAAAAAANCF4BwAAAAAALoQnAMAAAAAQBeCcwAAAAAA6EJwDgAAAAAAXQjOAQAAAACgC8E5AAAAAAB0ITgHAAAAAIAuBOcAAAAAANCF4BwAAAAAALqoTboAAAAAAIBKsqy1PekSEtFUXz1xcvU8UwAAAACAItjmO/cnXUIiXvv+Z5MuoWQE5wAAAAAAq7FoeVu8NHtR0mWUjcdfnb/Kti2GbRQjBzYkUE3fEpwDAAAAAKxG8/K2WNbascr2y4/YqeS1tLR3xOk/fyEiIi4+dPvI1daUvIbVvRYLl7cKzgEAAAAAqsWSltXPZZ6rK31o3e38tTWJ17DSkhXpnO89m3QBAAAAAADlaE3BOf+0uKU9CoVC0mUUneAcAAAAAOB9CoVCakdTF1NHRyFWtOWTLqPoBOcAAAAAAO+zvK0jOvLpG0ndFxa3tCVdQtEJzgEAAAAA3sdo855bnMLXSnAOAAAAAPA+i81v3mNpvMggOAcAAAAAeJ80hsF9ZWkKLzIIzgEAAAAA3mdJCsPgvrKstSPaO9K1QKjgHAAAAACgi/aOfCxv7Ui6jIqytCVdr5fgHAAAAACgC6PNe29xS1vSJRSV4BwAAAAAoAvBee8ZcQ4AAAAAkGKC895bYsQ5AAAAAEB6LVkhOO+txSl7zQTnAAAAAABdGHHee+0dhVjRlp7pWgTnAAAAAAD/Z0VbR7R3FJIuoyKl6YKD4BwAAAAA4P+kKfwttaUpeu0E5wAAAAAA/8f85usvTfOcC84BAAAAAP6PEefrL02vneAcAAAAAOD/pCn8LbVlre1RKKRjfnjBOQAAAABAROTzhVjWKjhfX/l8xLLWjqTLKArBOQAAAABARCxr64h8PukqKltaRuwLzgEAAAAAImJpSkLfJAnOAQAAAABSZPGKdIS+SVqSktdQcA4AAAAAEEacF0NaXkPBOQAAAABApGeakSQta+2Ijnwh6TI2mOAcAAAAAKh67R35WN7akXQZqZCGCxCCcwAAAACg6i1tEZoXi+AcAAAAACAFFre0JV1CaqRhgVDBOQAAAABQ9Yw4Lx4jzgEAAAAAUmCJEedFIzgvM2effXZkMplut5EjR671MY8++mjsvPPO0dDQEFtssUVceeWVJaoWAAAAACgXi1MwvUi5aGvPx4q2yh7BX5t0AcW27bbbxoMPPtj5c01NzRr3nTlzZnzmM5+J4447Lm688cb4/e9/HyeeeGIMGzYsDjnkkFKUCwAAAAAkbEVbR7R3FJIuI1WWtrRHQ92as9lyl7rgvLa2dp2jzFe68sorY7PNNotLLrkkIiK23nrreOaZZ+LCCy8UnAMAAABAlUjD1CLlZklLewzZKJd0GestVVO1RES88sorMXr06Bg3blxMnjw5/v73v69x3yeeeCImTZrUbdvee+8dzzzzTLS1rXlOo5aWlmhubu52AwDKi34NAJVBzwbKwRLTtBRdpU99k6rgfNddd43rr78+7r///vjJT34Sc+fOjT322CPeeeed1e4/d+7cGDFiRLdtI0aMiPb29pg/f/4azzNt2rQYOHBg523MmDFFfR4AwIbTrwGgMujZQDkw4rz4Kv01TVVwvu+++8YhhxwS2223XXzqU5+Ke++9NyIifvrTn67xMZlMptvPhUJhtdu7mjp1aixatKjz9vrrrxehegCgmPRrAKgMejZQDip9dHQ5WtbaHvl85c4bn7o5zrvq169fbLfddvHKK6+s9v6RI0fG3Llzu22bN29e1NbWxpAhQ9Z43FwuF7lc5c7PAwDVQL8GgMqgZwNJy+cLsaxVcF5s+XzE0tb26N9Ql3Qp6yVVI87fr6WlJV5++eUYNWrUau/ffffd44EHHui27Te/+U3ssssuUVdXmW8oAAAAANBzS1rbo1C5A6PLWiVP15Kq4PyMM86IRx99NGbOnBl/+MMf4nOf+1w0NzfHUUcdFRHvff3ryCOP7Nz/+OOPj3/84x9x+umnx8svvxzXXnttXHPNNXHGGWck9RQAAAAAgBKyMGjfqeTXNlVTtbzxxhtxxBFHxPz582PYsGGx2267xZNPPhljx46NiIg5c+bErFmzOvcfN25c3HfffXHaaafF5ZdfHqNHj45LL700DjnkkKSeAgAAAABQQpU8KrrcLa7g1zZVwfmtt9661vuvu+66Vbbtueee8cc//rGPKgIAAAAAypmFQftOJb+2qZqqBQAAAACgNxavaEu6hNRqa89HS3tH0mWsF8E5AAAAAFCVVrR1RHuHlUH7UqWOOhecAwAAAABVqVJD3UpSqQuECs4BAAAAgKpkmpa+V6kXJwTnAAAAAEBVWtJSmaFuJanUixOCcwAAAACgKlXqaOhKsqy1I9o78kmX0WuCcwAAAACg6rR15GN5a0fSZVSFShzZLzgHAAAAAKqO0ealU4mvteAcAAAAAKg6SyowzK1UzRU4z7ngHAAAAACoOpUY5lYqI84BAAAAACqA4Lx0lra0Rz5fSLqMXhGcAwAAAABVpSNfiGUtFgYtlUIhYnGFLRAqOAcAAAAAqspio81LrtJec8E5AAAAAFBVmpdX1ujnNKi011xwDgAAAABUFfObl54R5wAAAAAAZWzxisoa/ZwGS1sra4FQwTkAAAAAUDXaO/KxrFVwXmr5fGUtECo4BwAAAACqxpKW9ihUzsDnVGleXjnTtQjOAQAAAICqUWmLVKZJJc0tLzgHAAAAAKpGJYW3aVNJc8sLzgEAAACAqlFJ04WkzdKW9uiokAVCBecAAAAAQFVo68jHstaOpMuoWoVCxOIKGfEvOAcAAAAAqoLR5smrlDnmBecAAAAAQFVorqA5ttNqUYVcvBCcAwAAAABVoVJC2zSrlMVZBecAAAAAQFUwVUvylrd2RGt7Puky1klwDgAAAACk3oq2yghsq0EljPwXnAMAAAAAqVcJYW21qITpWgTnAAAAAEDqmaalfFTCRQzBOQAAAACQepUQ1laL5uVtUSgUki5jrQTnAAAAAECq5fOFipgepFq0dxRiWWtH0mWsleAcAAAAAEi1Ja3tkbcuaFkp928ACM4BAAAAgFRbtKy8Q9pqJDgHAAAAAEhQuYe01ajcF2sVnAMAAAAAqVbuIW01WtLSHh358l0gVHAOAAAAAKRWa3u+7BeirEaFQnlf0BCcAwAAAACpZZqW8lXO743gHAAAAABIrXIOZ6tdOb83gnMAAAAAILXKOZytduX83gjOAQAAAIBUKhQK0byifMPZatfano/lZTr/vOAcAAAAAEilJS3t0dFRSLoM1qJcR50LzgEAAACAVCrXUJZ/Ktf3SHAOAAAAAKRSuYay/FO5vkeCcwAAAAAglco1lOWfFq9oi458+U2nIzgHAAAAAFKnrSMfy1rKc+FJ/qlQeC88LzeCcwAAAAAgdYw2rxzl+F4JzgEAAACA1CnHMJbVK8f3SnAOAAAAAKROOYaxrF45vleCcwAAAAAgVQqFQjSXYRjL6rW05WNFW3nNRy84BwAAAABSZWlrR7R3FJIug14ot1HnqQrOp02bFh/96Eejf//+MXz48DjwwANjxowZa33MI488EplMZpXbX//61xJVDQAAAAAUU7mFsKxbub1nqQrOH3300fjqV78aTz75ZDzwwAPR3t4ekyZNiqVLl67zsTNmzIg5c+Z03j74wQ+WoGIAAAAAoNhM01J5yi04r026gGL69a9/3e3n6dOnx/Dhw+PZZ5+NT3ziE2t97PDhw2PQoEF9WB0AAAAAUArlFsKybotXtEU+X4hsNpN0KRGRshHn77do0aKIiNh4443Xue9OO+0Uo0aNik9+8pPx8MMP93VpAAAAAEAfaO/Ix9KW9qTLoJfy+YjFZfS+pWrEeVeFQiFOP/30+PjHPx7jx49f436jRo2Kq6++OnbeeedoaWmJG264IT75yU/GI488ssZR6i0tLdHS0tL5c3Nzc9HrBwA2jH4NAJVBzwaKbfGK9ihYF7QiNS9vi4GNdUmXEREpDs5POumkeOGFF+J3v/vdWvf78Ic/HB/+8Ic7f959993j9ddfjwsvvHCNwfm0adPinHPOKWq9AEBx6dcAUBn0bKDYTNNSuRYtb4sxSRfxf1I5VcvJJ58cd911Vzz88MOx6aab9vrxu+22W7zyyitrvH/q1KmxaNGiztvrr7++IeUCAH1AvwaAyqBnA8XWvEJwXqnK6b1L1YjzQqEQJ598ctxxxx3xyCOPxLhx49brOM8991yMGjVqjffncrnI5XLrWyYAUAL6NQBUBj0bKDYjzivXspaOaOvIR11N8uO9UxWcf/WrX42bb7457rzzzujfv3/MnTs3IiIGDhwYjY2NEfHelezZs2fH9ddfHxERl1xySWy++eax7bbbRmtra9x4441x++23x+23357Y8wAAAAAAem9FW0e0tOWTLoMN0Ly8LYZslPwF1VQF51dccUVEREyYMKHb9unTp8eUKVMiImLOnDkxa9aszvtaW1vjjDPOiNmzZ0djY2Nsu+22ce+998ZnPvOZUpUNAAAAABRBOU31wfppXtEuOC+2Qg+Wy73uuuu6/XzmmWfGmWee2UcVAQAAAACl0ry8PekS2EDNZTLVTvKTxQAAAAAAFMFiI84rXrl8a0BwDgAAAACkQvMKI84rXUtbPlraO5IuI11TtQAAAAAA1WlFW0e0tZdmYdCWttIHu13D5KSC5VxdTUnO07y8PYb1L8251kRwDgAAAABUvFJO8fHVW54r2blW5/Sfv5DIef/7yF1Kcp7FK9piWP9kFwg1VQsAAAAAUPEsDJoei8tgyh0jzgEAAACAilfKhUEvP2Knkp1rpZb2js6R5hcfun3kapOdyqQvCc4BAAAAAIpgSUvpwtZSzfW9xvPX1iReQ19a0dYRre35qK9NbsIUU7UAAAAAABWtpb0jWtpKszAopVHKCyGrIzgHAAAAACrakjKY2oPiSvo9FZwDAAAAABUt6dHJFF9zCeesXx3BOQAAAABQ0cphMUmKK+mLIYJzAAAAAKCiJR2yUnzLWtujUCgkdn7BOQAAAABQsQqFQixrFZynTT4fsay1I7HzC84BAAAAgIq1rLUj8vmkq6AvLE3wmwSCcwAAAACgYiUZrtK3kpyCR3AOAAAAAFSspQlO50HfWtpiqhYAAAAAgF4z4jy9liY4d73gHAAAAACoWILz9FrW2h6FQiGRcwvOAQAAAICKtazNVC1plc9HtLQns/Kr4BwAAAAAqEgr2jqioyOZEcmURlLfKBCcAwAAAAAVabmFQVNvWULvseAcAAAAAKhIy03TknpJvceCcwAAAACgIiU1GpnSSepbBYJzAAAAAKAirTDiPPWMOAcAAAAA6AXBefol9R4LzgEAAACAirSiLZ90CfSx9o5CtHeU/n0WnAMAAAAAFadQKERLuxHn1WBFu+AcAAAAAGCdWtrzUSgkXQWlkMR0LYJzAAAAAKDitCQwCplkJPFeC84BAAAAgIpjmpbq0So4BwAAAABYtyTCVJIhOAcAAAAA6AHBefVI4r2uLfkZKWvLWtuTLiERTfV+FQAAAAAqSVuHlUGrRWtH6aflkRbSzTbfuT/pEhLx2vc/m3QJAAAAAPRCW4cR59UiiYskgvOUKxQK8c7S1pi7aEW8u6w16XLK1mOvvL3W++trsjFqYGOMGJiLXG1NiaoCAAAAYE1aBedVI4mLJILzlFrW2h5vLlwRcxYtj5a2nv+PdfkRO/VhVavX0t4Rp//8hYiIuPjQ7RMJptf1GrW05WPxisXxyrzFMXSjXIwe1BhDN6qPTCZTogoBAAAA6Kojb6qWatFuxDkbIp8vxNtLWmL2wuWxYMn6jS7P1SU7mjpXW5N4DWtTKES8vbgl3l7cErm6bIwe1BibDGqMhjKuGQAAACCNTNVSPTryhSgUCiUdxCo4T4EVbR3xxrvL482Fy60mXEItbfmY+fbSeG3+0hiyUS42HdwYQ/oZhQ4AAABQCkacV5f2fCHqagTnrMPKucvfeHd5zF/cknQ5Va1QiJi/uCXmL26Jxvqa2GRQY4we1Bj1tdmkSwMAAABILcF5denIF6KUkz4IzitMa3s+3ly4PGYvXB7LWzuSLof3Wd7aEa/OWxJ/n78khvdviE0HN8agpvqkywIAAABIHcF5dSn1+y04rxCLV7TFrAXL4q3mFZHvw9lYWtpKH8a3tHes9r9LqdjzqufzEXMXrYi5i1ZE/4baGLNxU4wc0BDZrGlcAAAAADZUoVCIgty8quRL/IYLzsvcgqWtMXP+0nh36fot9tlbX73luZKcZ01O//kLiZz3v4/cpc+OvXhFe/zlzeZ4dd6S2Gzjpth0cGPU1pjGBQAAAGB9GWxefUr9ngvOy9TiFW3xt7eWlCwwp++1tufj1XlL4h8LlsUWQ/vFpoMbLSQKAAAAsB5KPfqY5BWMOOf1Bcvib28tTuTrJpcfsVPJz9nS3tE50vziQ7ePXG0JZ/lPQFt7PmbMXRxvNa+I7TcdZBFRAHptWWt70iUkoqneP10BAHiP3Lz6lPo99+mjzLyzpCVmzF2c2PmLPdd3r89fW5N4DaWycFlb/GVOc+w4ZlDSpQDQBwqFQixt7Yj2juIvTrLjuQ8U/ZiV4PnvfLrox8xmM7FRfa11SAAAoMyV+lqJ4LzMtJugqar0RZgCQDLaO/Lx7rK2WLisNRYtb4vmFW19uqB3NXrmtXf75LjZbES/+toY1FQfg5rqYnBTvW+EAQBAmSn1UBfBeZkZMaAhlgxrj9fmL03kKyctbR2lP2d7x2r/u5SSGOXev6E2th09sOTnBaB42jvyMbd5RbzV3BILl7WWrHebWq248vn3FvNevKI9Xl/w3rYBjXUxYkAuRg1sFKIDAEAVEpyXoS2HbRSjBjbErAXLYs6iFdHRUboE/au3PFeyc63Oyg/kpfbfR+5SsnMNaqqLMRs3xfD+OYuDAlSwOYuWx4y5i6O9hH16paSnNauGqdWal7dF8/K2+PvbS2Pc0H6x+dB+SZcEAEAXIpXqU+r3XHBepprqa2OrkQPiQ8P7x/ylLdHS5rvefenDI/v3+TkymYgh/XLRWJ/uoAGgGrR35OOl2c2Jnd83xEqnI1+IV+ctiSEb1Uf/hrqSnx8AgNXLSs6rTqkHoArOy1w2m4nh/RtKdr6/nLt3yc5VTprq/SoA0HO1NdkYPagx3ly4PJHz+4ZYaW28UX30828FAHppWWt70iUkxmdsSsHa7tWn1O+5v2R0o7kBQM9sM3pADNmoPv533pJY1prMCGz6Vn1tNsYN7RebDm40vRpAhcrnC/H2kmS+xf2JCx4u+TnLxW//38SSn7MpVxNDN8qV/LwkJ5PJRCYTiawRSDJqSpycpzIl/fGPfxwXXHBBzJkzJ7bddtu45JJL4l//9V/XuP+jjz4ap59+erz00ksxevToOPPMM+P4448vYcUAQCUaMaAhhvfPxdtLWmL2u8tjwdLSLBBqcdC+NaipLjYZ3Bgj+jdE1lAmgIr28tzmmLNwRdJlVJ2/vbU4kfN+YPhG1iWpMjXZTCJrDpGMUk/Pk7rg/Lbbbouvfe1r8eMf/zg+9rGPxVVXXRX77rtv/OUvf4nNNttslf1nzpwZn/nMZ+K4446LG2+8MX7/+9/HiSeeGMOGDYtDDjkkgWcAAFSSTOa9adWG92+IlvaOeHtxS8xb3BILl7VGvo8GtyW9MGcaFwcd1FQXw/rnYsSAhmhI2XMDqGabD+kXbR2FmL+4peTnvvjQ7Ut+zpb2fEy948WIiJh20PjI1WZLXkMSstmI4f0bYtSg0k11S3kQnFcXI8430MUXXxzHHHNMHHvssRERcckll8T9998fV1xxRUybNm2V/a+88srYbLPN4pJLLomIiK233jqeeeaZuPDCCwXnAECv5GprYtPBTbHp4KZo78jHgmWtsWBpayxY0lrU6VwsDlqMY2Vj4371MaRfLjbuVx/1VRIsAFSbfrna2HHMoFjR9t7F7beX9O3F7a6SWhNkpZUBehJKsS5JTU0mNm6qj2H9czGsfy7qavTyalSbzUZLlH4qJpJRKzhff62trfHss8/Gf/zHf3TbPmnSpHj88cdX+5gnnngiJk2a1G3b3nvvHddcc020tbVFXV3dKo9paWmJlpZ/Xq1ubm4uQvUAQDEl3a9ra7KdI9EjIla0dcTCZW2xcHlrLFzWFktb2td7WheLg/ZeU64mBjbWxaCm+hjcVGddF4AyUoqe3VBXE2M2booxGzdFPl+Ihcvb4t1lrbFwWWssWt5WkiCdDVNTk4lBjXUxuKk+BjfVx4DGWmuQEHU1/h+oFjU1mZL/zqfqE8P8+fOjo6MjRowY0W37iBEjYu7cuat9zNy5c1e7f3t7e8yfPz9GjRq1ymOmTZsW55xzTvEKBwCKrtz6dUNdTYwcWBMjB74XpLd35GNJS3vkfbO0xz4ydnCvH5OJiI0aao1CAyhjpe7Z2WwmNu5XHxv3q4+I9xYQbV7RFu8uey9MX7SsLTqK0KCtSbJhamsynSH5oH510T8nKGdVtf6NVzXqE3ivUxWcr/T+P6SFQmGtf1xXt//qtq80derUOP300zt/bm5ujjFjxqxvuQBAHyj3fl1bk41BTfXr9di/nLt3kaupDEaJA6RT0j07m83EoKb6GNRUH+OiX2eQ/s7S1nh36Xsj0tfnW2JJrwdSaWuSZLMRg5rqY0i/+hjcr15QTo8YcV49khgIk6pPH0OHDo2amppVRpfPmzdvlVHlK40cOXK1+9fW1saQIUNW+5hcLhe5XK44RQMAfSLN/VqADECalFvP7hqkx7CIto58vLu0NeYvaY35S1qitb1n87pU65okET2/aNBYXxNDN8rFkI3eG1le6oX/qHxJLoBbrb/jSV2QS+IiSao+ddXX18fOO+8cDzzwQBx00EGd2x944IH4t3/7t9U+Zvfdd4+7776727bf/OY3scsuu6x2fnMAAACgetTVZGP4gIYYPqAhCoVCNK9oj/lLWmL+4pZYvKJ9jY+r1jVJIta8LkkmEzGwsS6GbpSLof1zsVEuVbEUCaivSe5bFdX6O16KxX9XJ4mpp1L3F+r000+PL37xi7HLLrvE7rvvHldffXXMmjUrjj/++Ih47ytgs2fPjuuvvz4iIo4//vj40Y9+FKeffnocd9xx8cQTT8Q111wTt9xyS5JPAwAAACgzmUwmBjbWxcDGuthy2Eaxoq0j3lnaGisSGHlazsYN67fKto1ytbFxv3rrjlBUowY1xJCN1m/6Q9bP7luufoaOvlZrxPmGO/zww+Odd96Jc889N+bMmRPjx4+P++67L8aOHRsREXPmzIlZs2Z17j9u3Li477774rTTTovLL788Ro8eHZdeemkccsghST0FAACgii1rXfMI1jQzDRWVqKGuJjYZ1Lja+6p1TZIIv8+UTl1NNrGLMdX6O15Nv9+ZQmF9lrigq+bm5hg4cGAsWrQoBgwYkHQ5AKSMPlMcXkegrxUKhVjS0h6LV7THhnzI+tj3HypaTZXk9/+x13o/tr4mG4Oa6hIfyarXFIfXEYC+1NM+Uz2XCACqnNFrAFB8Le0d8c6S1liwtDXeWdoabT1cNJBVvfxm8wY9PpOJGNBYFxv3q4+h/XIxoLE2MhkLDQIA66dHacLBBx/c4wP+8pe/XO9iAKpBPl+IfAJf9tnmO/eX/Jzl4NXz9k3kvDXZjA/rACm1rLU95jW3xLzFLdG8vK3ox7/8iJ2Kfsx1aWnv6Fxk7OJDt09kAa4NVShELFrWFouWtcXMt5dGXW02hm5UH8P7N8SQfvWRzerLAEDP9Sg4HzhwYF/XAVA1Zi1YFq/OW5J0GVXjkRlvJ3Lej26+cQxsqkvk3AAUX3tHPuY2r4g5i1bEomXFD8u7ytUlG1rnamsSr6EY2trzMWfhipizcEXU1mRi5MCG2GRQY/Rv0J8BgHXrUXA+ffr0vq4DoGq0diTzFW6j10qrpaMjInwwB6h0re35mLVgabz+7vLo6LA8VKVq7yjEGwuWxxsLlsfgfnWx+ZB+MWSjXNJlAQBlbL0nfn377bdjxowZkclk4kMf+lAMGzasmHUBpFZrQnOfJj1yLC2j13oqqfcZgOJ5fcGyePXtJSUPzFvaOkp6voj3Lnav7r9LqVT/Tnh3aVu8u3RhDNmoPrYeNSAaqujfJwBAz/U6OF+6dGmcfPLJcf3110c+/14oUFNTE0ceeWRcdtll0dTUVPQiAdIkqRHnlFabUYkAFe2lNxfFnIUrEjn3V295LpHzrrTy22Kl9t9H7lLS872zpDX+MHNBfGSzQaZvAQBWke3tA04//fR49NFH4+67746FCxfGwoUL484774xHH300vv71r/dFjQCp0mYkclVoc4EEoGLNW7wisdCc0mprz8eMuYuTLgMAKEO9HnF+++23xy9+8YuYMGFC57bPfOYz0djYGIcddlhcccUVxawPIHWMRK4OpmoBqFyFhFu1dUlKqyPv32YAwKp6HZwvW7YsRowYscr24cOHx7Jly4pSFECaGYlcHbzPAJVreP9cjBzYEHMXJTPqPOk1QappXZL62mxsPXpA0mUAAGWo11O17L777nHWWWfFihX//Efk8uXL45xzzondd9+9qMUBpE0+XzCqqUr4ZgFA5cpkMjF+k4Gx/aYDo1+u12ONqADZbMSmGzfGblsMiQHmNwcAVqPX/wr8//6//y/22Wef2HTTTWOHHXaITCYTzz//fDQ0NMT999/fFzUCpEZb3ijkatFuxDlAxRs+oCGG9c/FgqWtMWfRinh7SUt0lODCaEtbR5+fY5Vztnes9r9LqRSj3Ps31MaogY0xcmBD1Nf2ehwZAFBFeh2cjx8/Pl555ZW48cYb469//WsUCoWYPHlyfOELX4jGxsa+qBEgNdqNQq4abb5ZAJAKmUwmhmyUiyEb5SKfL8SCZa3xzpLWeGdpSyxr6ZuA+au3PNcnx+2plXOdl9p/H7lL0Y9ZU5OJwU31MaRffQzrn4uGKpmCBgDYcOv1vcPGxsY47rjjil0LQOoJzquHEecA6ZPNZmLoRrkYulEuIvrHiraOWLS8LZa1JjNCO222HL5R0Y5Vk8nEwKa6GNBQG5lMpmjHBQCqx3oF57Nnz47f//73MW/evMi/b9qBU045pSiFAaRRu6laqkahENGRL0RN1od1gLRqqKvpkxHMfzl376IfsxI01ZtPHgAoH73+l8n06dPj+OOPj/r6+hgyZEi3q/eZTEZwDrAW7abvqCrt+XzUZH0lHIDeESADACSv1/8i+853vhPf+c53YurUqZHNWkwFoDcE59Wlw/sNAAAAFanXyfeyZcti8uTJQnOA9dBhjvOq4kIJAAAAVKZep9/HHHNM/PznP++LWgBSr6MgSK0mLpQAAABAZer1VC3Tpk2L/fbbL37961/HdtttF3V1dd3uv/jii4tWHEDamLqjuuRdKAEAAICK1Ovg/Hvf+17cf//98eEPfzgiYpXFQQFYM0FqdXGhBAAAACpTr4Pziy++OK699tqYMmVKH5QDkG6C1Ori7QYAAIDK1Os5znO5XHzsYx/ri1oAUk9wXl3MaQ8AAACVqdfB+amnnhqXXXZZX9QCkHpy1OqSd6EEAAAAKlKvp2p56qmn4qGHHop77rkntt1221UWB/3lL39ZtOIA0sYc59XF2w0AAACVqdfB+aBBg+Lggw/ui1oAUk9wXl1M1QIAAACVqcfB+ZIlS2KjjTaK6dOn92U9AKkmRq0uBcE5AAAAVKQez3E+dOjQ2HfffeOKK66IN998sy9rAkgtQWp18W4DAABAZepxcD5jxoz4zGc+E7fffnuMGzcuPvrRj8Z//dd/xQsvvNCX9QGkity8uni/AQAAoDL1ODgfO3ZsnHzyyfHggw/GvHnz4vTTT4+XXnopPvGJT8S4cePi1FNPjYceeig6Ojr6sl4AqCCScwAAAKhEPQ7Ouxo4cGAcccQRceutt8b8+fPjqquuinw+H0cffXQMGzYsbrrppmLXCZAKYtTqYsQ5AAAAVKYeLw66xgPU1sakSZNi0qRJcdlll8Vzzz0X7e3txagNIHUEqQAAAADlr8fBeU/mMq+trY2xY8fGxhtvvEFFAQAAAABAUnocnO+4446RyWSisI7hkplMJnbcccf46U9/GuPHj9/gAgEAAAAAoJR6HJzPnDlznfvk8/l466234oILLogTTjghHnvssQ0qDiBtMpmkKwAAAABgXXocnI8dOzYiIlpbW6O+vn61+8yfPz/GjRsX559/fuywww7FqRAAKpQLJQAAAFCZsr19wGGHHRb5fH6V7W+99VZMmDAhIiLGjRsXjz/++AYXB5A2clQAAACA8tfr4HzOnDlxzDHHrLJtwoQJsdVWW0VERE1NjRHnAKthBHK18YYDAABAJep1cH7ffffFU089FaeddlpERMyePTsmTJgQ2223XfzsZz8reoEA6SJIrSYulAAAAEBl6vEc5ysNGTIk7r///vj4xz8eERH33ntvfOQjH4mbbropstle5/AAVUWQWl2y3nAAAACoSL0OziMiNt1003jggQfi4x//eHz605+OG264ITLCAYB1EqRWl6y3GwAAACpSj4LzwYMHrzYYX7ZsWdx9990xZMiQzm0LFiwoXnUAKSNIrS4ZU/MAAABARepRcH7JJZf0cRkA1cGI8+piBjMAAACoTD0Kzo866qi+rgOgKsjNq4sLJQAAAFCZjIUDKKEac7VUFcE5AAAAVCbBOUAJCVKri6laAAAAoDL5SA9QQoLz6lLj/QYAAICKJDgHKCFTtVQX7zcAAABUph4H56NHj44TTjghfvWrX0Vra2tf1gSQWrWC1KoiOAcAAIDK1OPg/Oabb46mpqY45ZRTYujQoXHooYfGDTfcEAsWLOjL+gBSJStIrSqCcwAAAKhMPQ7OJ0yYEBdddFG88sor8cQTT8RHPvKRuPzyy2PUqFExYcKE+OEPfxj/+7//25e1AlQ8I86ri+AcAAAAKtN6zXG+7bbbxtSpU+PJJ5+MWbNmxRe+8IV46KGHYrvttovx48fHvffeW+w61+m1116LY445JsaNGxeNjY2x5ZZbxllnnbXOaWWmTJkSmUym22233XYrUdVAtRGkVpfarKVEAAAAoBLVbugBRowYEccdd1wcd9xxsWzZsrj//vsjl8sVo7Ze+etf/xr5fD6uuuqq+MAHPhAvvvhiHHfccbF06dK48MIL1/rYffbZJ6ZPn975c319fV+XC1QpI86rRybjQgkAAABUqg0OzrtqamqKgw46qJiH7LF99tkn9tlnn86ft9hii5gxY0ZcccUV6wzOc7lcjBw5sq9LBIjaGiOQq4XQHAAAACpXUYPzcrNo0aLYeOON17nfI488EsOHD49BgwbFnnvuGeedd14MHz58jfu3tLRES0tL58/Nzc1FqRdIPyPOq4dpWpKnXwNAZdCzAShHqf1U/7//+79x2WWXxfHHH7/W/fbdd9+46aab4qGHHoqLLroonn766dhrr726Ne33mzZtWgwcOLDzNmbMmGKXD6SU4Lx61NZ4r5OmXwNAZdCzAShHZR+cn3322ass3vn+2zPPPNPtMW+++Wbss88+ceihh8axxx671uMffvjh8dnPfjbGjx8f+++/f/zqV7+Kv/3tb2td4HTq1KmxaNGiztvrr79elOcKpF9NNhMZeWpVqBOcJ06/BoDKoGcDUI56NVVLe3t7NDQ0xPPPPx/jx4/vq5q6Oemkk2Ly5Mlr3WfzzTfv/O8333wzJk6cGLvvvntcffXVvT7fqFGjYuzYsfHKK6+scZ9cLpfIAqhA5ctkMlGTzUR7RyHpUuhjpmpJnn4NAJVBzwagHPUqOK+trY2xY8dGR0dHX9WziqFDh8bQoUN7tO/s2bNj4sSJsfPOO8f06dMjux6hxTvvvBOvv/56jBo1qtePBeiJ+ppstJfw7yjJMFULAAAAVK5eJ8vf+ta3YurUqbFgwYK+qGe9vfnmmzFhwoQYM2ZMXHjhhfH222/H3LlzY+7cud3222qrreKOO+6IiIglS5bEGWecEU888US89tpr8cgjj8T+++8fQ4cOjYMOOiiJpwFUgdoaI5GrQb33GQAAACpWr0acR0Rceuml8eqrr8bo0aNj7Nix0a9fv273//GPfyxacb3xm9/8Jl599dV49dVXY9NNN+12X6HwzykRZsyYEYsWLYqIiJqamvjzn/8c119/fSxcuDBGjRoVEydOjNtuuy369+9f0vqB6mHu6+rgAgkAAABUrl4H5wceeGAflLHhpkyZElOmTFnnfl1D9MbGxrj//vv7sCqAVdUJVKuCCyQAAABQuXodnJ911ll9UQdA1aivFZxXA1O1AAAAQOXqdXC+0rPPPhsvv/xyZDKZ2GabbWKnnXYqZl0AqWXEeXXwPgMAAEDl6nVwPm/evJg8eXI88sgjMWjQoCgUCrFo0aKYOHFi3HrrrTFs2LC+qBMgNUzhUR3qfLMAAAAAKlavP9WffPLJ0dzcHC+99FIsWLAg3n333XjxxRejubk5TjnllL6oESBVTOFRHbzPAAAAULl6PeL817/+dTz44IOx9dZbd27bZptt4vLLL49JkyYVtTiANDLHefplMr5ZAAAAAJWs1+lNPp+Purq6VbbX1dVFPp8vSlEAaSY4T7+6mmxkMoJzAAAAqFS9Tm/22muvOPXUU+PNN9/s3DZ79uw47bTT4pOf/GRRiwNII4tGpp+LIwAAAFDZev3J/kc/+lEsXrw4Nt9889hyyy3jAx/4QIwbNy4WL14cl112WV/UCJAqdTXZyMpVU01wDgAAAJWt13OcjxkzJv74xz/GAw88EH/961+jUCjENttsE5/61Kf6oj6AVKqvqYkV+Y6ky6CPWBgUAAAAKluvgvP29vZoaGiI559/Pj796U/Hpz/96b6qCyDVcnXZWNEmOE+rnBHnAAAAUNF69cm+trY2xo4dGx0dwh6ADWFEcrrlamuSLgEAAADYAL1Obr71rW/F1KlTY8GCBX1RD0BVyNUJztPMHOcAAABQ2Xo9x/mll14ar776aowePTrGjh0b/fr163b/H//4x6IVB5BWRiSnm6laAAAAoLL1Ojg/8MAD+6AMgOpiRHK6+UYBAAAAVLZeLw4aEfGlL30pxowZ0ycFAVSDBsF5qvlGAQAAAFS2Xi8OeuGFF1ocFGAD5eoEq2lVW5OJmmwm6TIAAACADdDrIY+f/OQn45FHHumDUgCqhzmw08tocwAAAKh8vZ7jfN99942pU6fGiy++GDvvvPMqi4MecMABRSsOIK3qarJRk81ER76QdCkUmfnNAQAAoPL1Ojg/4YQTIiLi4osvXuW+TCZjGheAHsrVZmNZq7+ZadNgxDkAAABUvF4H5/l8vi/qAKg6uboawXkKNRhxDgAAABXPp3uAhAhY06nBwq8AAABQ8Xqc2nzmM5+JRYsWdf583nnnxcKFCzt/fuedd2KbbbYpanEAaSZgTSfvKwAAAFS+Hgfn999/f7S0tHT+fP7558eCBQs6f25vb48ZM2YUtzqAFBOwppNvEgAAAEDl6/Gn+0KhsNafAeidhloBaxrlLA4KAAAAFU9qA5AQI87Tp742GzXZTNJlAAAAABuox8F5JpOJTCazyjYA1o/gPH28pwAAAJAOtT3dsVAoxJQpUyKXy0VExIoVK+L444+Pfv36RUR0m/8cgHWryWaivjYbre35pEuhSMxvDgAAAOnQ4+D8qKOO6vbzv//7v6+yz5FHHrnhFQFUkYa6GsF5ijQacQ4AAACp0OPgfPr06X1ZB0BVaqyrieblbUmXQZGYqgUAAADSocfBOQDF11hfuqk9Wto6SnauznO2d6z2v0spV8IwW3AOAAAA6SA4B0hQrrZ0QetXb3muZOdandN//kIi5/3vI3cp2bka6wXnAAAAkAZWMQNIkKA1XcxxDgAAAOlgxDlAgkoZtF5+xE4lO9dKLe0dnSPNLz50+5KOsC+1+tps1GQzSZcBAAAAFIHgHCBBpQzOSznX92rPX1uTeA19ybcHAAAAID1M1QKQoGw2E7k6f4rTwDQtAAAAkB7SGoCECVzTocH7CAAAAKkhOAdImMA1HUzVAgAAAOkhOAdIWJPANRV8cwAAAADSQ3AOkDAjldPBBRAAAABID8E5QMKMVK582WxErlZLBQAAgLTwKR8gYUacV76G2prIZDJJlwEAAAAUieAcIGG52pqoyQpdK5mLHwAAAJAugnOAMiB4rWxN9bVJlwAAAAAUkeAcoAxYWLKymaceAAAA0kVwDlAGBK+VzTcGAAAAIF0E5wBlQPBa2XxjAAAAANJFcA5QBsyRXdl8YwAAAADSRXAOUAaMWK5cDXU1kc1mki4DAAAAKCLBOUAZyNVmI+svckUyzQ4AAACkj5gGoAxkMplorDNdSyXybQEAAABIH8E5QJkQwFYm7xsAAACkT6qC88033zwymUy323/8x3+s9TGFQiHOPvvsGD16dDQ2NsaECRPipZdeKlHFAP9kyo/K5H0DAACA9ElVcB4Rce6558acOXM6b9/61rfWuv8PfvCDuPjii+NHP/pRPP300zFy5Mj49Kc/HYsXLy5RxQDvaawTwFaipnpT7AAAAEDapC4479+/f4wcObLzttFGG61x30KhEJdcckl885vfjIMPPjjGjx8fP/3pT2PZsmVx8803l7BqAFN+VCoXPAAAACB9Uhecn3/++TFkyJDYcccd47zzzovW1tY17jtz5syYO3duTJo0qXNbLpeLPffcMx5//PE1Pq6lpSWam5u73QA2VL+ckcuVpqGuJmqymaTLYA30awCoDHo2AOUoVcH5qaeeGrfeems8/PDDcdJJJ8Ull1wSJ5544hr3nzt3bkREjBgxotv2ESNGdN63OtOmTYuBAwd23saMGVOcJwBUtVxtNrKp+qucfuY3L2/6NQBUBj0bgHJU9hHN2WefvcqCn++/PfPMMxERcdppp8Wee+4Z22+/fRx77LFx5ZVXxjXXXBPvvPPOWs+RyXQfLVgoFFbZ1tXUqVNj0aJFnbfXX399w58oUPUymUw01hl1XklMr1Pe9GsAqAx6NgDlqOwTmpNOOikmT5681n0233zz1W7fbbfdIiLi1VdfjSFDhqxy/8iRIyPivZHno0aN6tw+b968VUahd5XL5SKXy62rdIBea6qviaUt7UmXQQ/1szBoWdOvAaAy6NkAlKOy/8Q/dOjQGDp06Ho99rnnnouI6BaKdzVu3LgYOXJkPPDAA7HTTjtFRERra2s8+uijcf75569fwQAbwAjmytJQX/Zf3AIAAADWQ2o+8T/xxBPxwx/+MJ5//vmYOXNm/OxnP4uvfOUrccABB8Rmm23Wud9WW20Vd9xxR0S8Ny3C1772tfje974Xd9xxR7z44osxZcqUaGpqis9//vNJPRWgipkzu7IYcQ4AAADplJpP/LlcLm677bY455xzoqWlJcaOHRvHHXdcnHnmmd32mzFjRixatKjz5zPPPDOWL18eJ554Yrz77rux6667xm9+85vo379/qZ8CQDQJYitGJhPRWOdCBwAAAKRRahKaj3zkI/Hkk0+uc79CodDt50wmE2effXacffbZfVQZQM+ZqqVyNNTVRDa75oWkAQAAgMqVmqlaANKgoa4maoSxFcG0OgAAAJBegnOAMiOQrQzmNwcAAID0EpwDlBnTtVQG7xMAAACkl+AcoMxYILQy+GYAAAAApJfgHKDMGMlcGbxPAAAAkF6Cc4AyI5Atf5lMRGOd9wkAAADSSnAOUGZMAVL+GutqIpPJJF0GAAAA0EcE5wBlJldbEzU1Qtly1pQzDz0AAACkmeAcoAw1mQakrJlOBwAAANJNcA5QhvoZ0VzWzG8OAAAA6SY4ByhD5jkvby5sAAAAQLoJzgHKkKlAypv3BwAAANJNcA5QhprqjGguV9lsRK5W+wQAAIA088kfoAw15YxoLleNdbWRyWSSLgMAAADoQ4JzgDJUV5ONOqOay5JpWgAAACD9pDIAZUpAW568LwAAAJB+gnOAMtVYJ6AtR005888DAABA2gnOAcqUkc3lqckFDQAAAEg9wTlAmWqqN7K5HDW6oAEAAACpJzgHKFMC2vJTk81EgxHnAAAAkHqCc4AyZaqW8uNiBgAAAFQHwTlAmaqryUZdrT/T5cTFDAAAAKgOEhmAMtZPUFtWBOcAAABQHQTnAGXMfNrlpdGCrQAAAFAVBOcAZaxfTlBbTppcyAAAAICqIDgHKGONgtqyYnFQAAAAqA6Cc4AyJqgtHzXZjKlzAAAAoEoIzgHKmMUoy4eLGAAAAFA9BOcAZayuJht1tf5UlwPT5gAAAED1kMYAlDmjzsuD9wEAAACqh+AcoMwZ6VweTNUCAAAA1UNwDlDmjHQuD031tUmXAAAAAJSI4BygzBnpXB5cwAAAAIDqITgHKHNNdUY6Jy2bjchZpBUAAACqhhQAoMwZcZ68hrqayGQySZcBAAAAlIjgHKDM1ddmo6ZGaJsk85sDAABAdRGcA1SAxjqjzpPk9QcAAIDqIjgHqAAWpkyW1x8AAACqi+AcoAIIbpPVYMQ5AAAAVBXBOUAFaDTHdqJcuAAAAIDqIjgHqADm2E6W1x8AAACqi+AcoAIIbpPTUFcT2Wwm6TIAAACAEhKcA1SAhrpsZGS3iWis1yoBAACg2kgDACpAJpMx6jwhjXXmlwcAAIBqIzgHqBANFqhMRKPXHQAAAKqO4BygQjQJcBNhpD8AAABUH8E5QIUQ4CbD6w4AAADVR3AOUCEEuMkwVQsAAABUH8E5QIUQ4JZeTU0m6mu1SgAAAKg20gCACmHEeel5zQEAAKA6pSY4f+SRRyKTyaz29vTTT6/xcVOmTFll/912262ElQP0TG1NNmprMkmXUVUE5wAAAFCdapMuoFj22GOPmDNnTrdt3/72t+PBBx+MXXbZZa2P3WeffWL69OmdP9fX1/dJjQAbqqm+NpqXtyVdRtUwPQ4AAABUp9QE5/X19TFy5MjOn9va2uKuu+6Kk046KTKZtY/QzOVy3R4LUK4a62oE5yVkxDkAAABUp9QE5+931113xfz582PKlCnr3PeRRx6J4cOHx6BBg2LPPfeM8847L4YPH77G/VtaWqKlpaXz5+bm5mKUDLBOjfWpmWGrIjQIziuafg0AlUHPBqAcpTaBueaaa2LvvfeOMWPGrHW/fffdN2666aZ46KGH4qKLLoqnn3469tprr25N+/2mTZsWAwcO7Lyt6xwAxSLILS1TtVQ2/RoAKoOeDUA5Kvvg/Oyzz17jop8rb88880y3x7zxxhtx//33xzHHHLPO4x9++OHx2c9+NsaPHx/7779//OpXv4q//e1vce+9967xMVOnTo1FixZ13l5//fUNfp4APWHqkNLyelc2/RoAKoOeDUA5KvupWk466aSYPHnyWvfZfPPNu/08ffr0GDJkSBxwwAG9Pt+oUaNi7Nix8corr6xxn1wuF7lcrtfHBthQRkCXTn1tNmqya18jg/KmXwNAZdCzAShHZR+cDx06NIYOHdrj/QuFQkyfPj2OPPLIqKur6/X53nnnnXj99ddj1KhRvX4sQF9rqBWcl4qLFAAAAFC9yn6qlt566KGHYubMmWucpmWrrbaKO+64IyIilixZEmeccUY88cQT8dprr8UjjzwS+++/fwwdOjQOOuigUpYN0CPZbCZydan7012WTNMCAAAA1avsR5z31jXXXBN77LFHbL311qu9f8aMGbFo0aKIiKipqYk///nPcf3118fChQtj1KhRMXHixLjtttuif//+pSwboMca62qipS2fdBmpZyFWAAAAqF6pC85vvvnmtd5fKBQ6/7uxsTHuv//+vi4JoKjeC3Tbki4j9UzVAgAAANXL9/0BKoxAtzQaarVIAAAAqFZSAYAKYwqR0nCBAgAAAKqX4Bygwli0sjQaar3OAAAAUK0E5wAVRnDe93J12chmM0mXAQAAACREcA5QYXK12cjIdPuUixMAAABQ3QTnABUmm81EzjQifco88gAAAFDdBOcAFaihzp/vviQ4BwAAgOomeQGoQILdvtVY7/UFAACAaiY4B6hAgvO+1VCrPQIAAEA1kwwAVCAjovuW1xcAAACqm+AcoAIZEd23Giy+CgAAAFVN8gJQgYyI7jv1tdnIZjNJlwEAAAAkSHAOUIGMiO47LkoAAAAAgnOACpTNZiJX5094X3BRAgAAAJC6AFSohjoBb19ocEECAAAAqp50AKBCGRndN1yQAAAAAATnABWqsd6f8L4gOAcAAACkLgAVKmfEeZ8wVQsAAAAgHQCoUEZG941GrysAAABUPcE5QIUyMrr4amsyUVvjdQUAAIBqJx0AqFBGRhefUfwAAABAhOAcoGLV1mSjtiaTdBmpIjgHAAAAIgTnABVN0FtcRvEDAAAAEYJzgIomOC8u88YDAAAAEYJzgIom6C0uFyIAAACACME5QEUztUhxNdR6PQEAAADBOUBFM0K6uHJG8AMAAAAhOAeoaEZIF082G5Gr1RYBAAAAwTlARTNCungaamsik8kkXQYAAABQBiQuABUsV5uNrL/kRZEz7Q0AAADwf8QtABUsk8lEznQtRdFg9D4AAADwf6QEABXOAqHF4XUEAAAAVhKcA1Q4I6WLQ3AOAAAArCRtAahwAt/iaKjVEgEAAID3SAkAKpzgvDi8jgAAAMBKgnOACmekdHEIzgEAAICVpC0AFU7gu+HqarNRk80kXQYAAABQJgTnABVOcL7hjNoHAAAAupIUAFS4mmwm6gS/G6Sx3sUHAAAA4J8kLQApYMT0hjFqHwAAAOhK0gKQAoLfDdNQ6/UDAAAA/klwDpACphrZMA112iEAAADwT5ICgBQwYnrD5IzYBwAAALoQnAOkgBHTG6ZRcA4AAAB0IWkBSAEjptdfNhtRb3FVAAAAoAtJAUAKGHG+/kxzAwAAALyfpAUgBXK1NZH1F329NFhYFQAAAHgfMQtAShg5vX68bgAAAMD7Cc4BUsLI6fVjmhsAAADg/aQFAClh5PT6abCwKgAAAPA+FROcn3feebHHHntEU1NTDBo0aLX7zJo1K/bff//o169fDB06NE455ZRobW1d63FbWlri5JNPjqFDh0a/fv3igAMOiDfeeKMPngFA3zJyev0IzgEAAID3q5iUpbW1NQ499NA44YQTVnt/R0dHfPazn42lS5fG7373u7j11lvj9ttvj69//etrPe7Xvva1uOOOO+LWW2+N3/3ud7FkyZLYb7/9oqOjoy+eBkCfEQCvn0avGwAAAPA+tUkX0FPnnHNORERcd911q73/N7/5TfzlL3+J119/PUaPHh0RERdddFFMmTIlzjvvvBgwYMAqj1m0aFFcc801ccMNN8SnPvWpiIi48cYbY8yYMfHggw/G3nvv3TdPBqAPCIDXT662Yq4hAwAAACWSmrTgiSeeiPHjx3eG5hERe++9d7S0tMSzzz672sc8++yz0dbWFpMmTercNnr06Bg/fnw8/vjjfV4zQDEZcd57ubpsZLOZpMsAAAAAykzFjDhfl7lz58aIESO6bRs8eHDU19fH3Llz1/iY+vr6GDx4cLftI0aMWONjIt6bF72lpaXz5+bm5g2oHKA4jJzuPaP0002/BoDKoGcDUI4STVnOPvvsyGQya70988wzPT5eJrPqqMFCobDa7WuzrsdMmzYtBg4c2HkbM2ZMr44P0Bey2UzkLBDaK0bpp5t+DQCVQc8GoBwlmrCcdNJJ8fLLL6/1Nn78+B4da+TIkauMEn/33Xejra1tlZHoXR/T2toa7777brft8+bNW+NjIiKmTp0aixYt6ry9/vrrPaoRoK8ZQd07DS40pJp+DQCVQc8GoBwlOlXL0KFDY+jQoUU51u677x7nnXdezJkzJ0aNGhUR7y0YmsvlYuedd17tY3beeeeoq6uLBx54IA477LCIiJgzZ068+OKL8YMf/GCN58rlcpHL5YpSN0AxvTeCui3pMiqGEefppl8DQGXQswEoRxUz1G7WrFnx/PPPx6xZs6KjoyOef/75eP7552PJkiURETFp0qTYZptt4otf/GI899xz8T//8z9xxhlnxHHHHRcDBgyIiIjZs2fHVlttFU899VRERAwcODCOOeaY+PrXvx7/8z//E88991z8+7//e2y33XbxqU99KrHnCrC+jKDuHcE5AAAAsDoVszjod77znfjpT3/a+fNOO+0UEREPP/xwTJgwIWpqauLee++NE088MT72sY9FY2NjfP7zn48LL7yw8zFtbW0xY8aMWLZsWee2H/7wh1FbWxuHHXZYLF++PD75yU/GddddFzU1whSg8giCe8frBQAAAKxOxQTn1113XVx33XVr3WezzTaLe+65Z433b7755lEoFLpta2hoiMsuuywuu+yyYpQJkChBcO+YEx4AAABYHd/pB0gRwXnP1dVmoyabSboMAAAAoAwJzgFSxAjqnmuo1QIBAACA1ZMaAKRITTYTdQLhHmmsd5EBAAAAWD3pCkDKGHXeM6a1AQAAANZEcA6QMg11/rT3hAsMAAAAwJpIVwBSRiDcMzkXGAAAAIA1kBoApIwpSHrGBQYAAABgTWqTLgCA4lpTcN7S1lHiSiJa2jtW+9+llFvD6+ECAwAAALAmgnOAlGmsX30g/NVbnitxJd2d/vMXEjnvfx+5yyrbamsyUVfjS1cAAADA6gnOAVKmX31N7L7lkKTLKBurey2ymUwClQAAAACVQnAOkDKZTCb65Vb98/6Xc/dOoJrkNdVrdQAAAEDvSBMAqoQAGQAAAKBnTPAKAAAAAABdCM4BAAAAAKALwTkAAAAAAHQhOAcAAAAAgC4E5wAAAAAA0IXgHAAAAAAAuhCcAwAAAABAF4JzAAAAAADoQnAOAAAAAABdCM4BAAAAAKALwTkAAAAAAHQhOAcAAAAAgC4E5wAAAAAA0IXgHAAAAAAAuhCcAwAAAABAF4JzAAAAAADoQnAOAAAAAABd1CZdQBoUCoWIiGhubk64EgDSaGV/WdlvWD/6NQB9Tc8uDj0bgL7U034tOC+CxYsXR0TEmDFjEq4EgDRbvHhxDBw4MOkyKpZ+DUCp6NkbRs8GoBTW1a8zBZfCN1g+n48333wz+vfvH5lMJulyKlJzc3OMGTMmXn/99RgwYEDS5QBF5Pd7wxUKhVi8eHGMHj06slmzrK0v/XrD+X2GdPM7vuH07OLQszeM32VIN7/jG66n/dqI8yLIZrOx6aabJl1GKgwYMMAvPaSU3+8NY9TahtOvi8fvM6Sb3/ENo2dvOD27OPwuQ7r5Hd8wPenXLoEDAAAAAEAXgnMAAAAAAOhCcE5ZyOVycdZZZ0Uul0u6FKDI/H5Devh9hnTzOw7p4HcZ0s3veOlYHBQAAAAAALow4hwAAAAAALoQnAMAAAAAQBeCcwAAAAAA6EJwDgAAAAAAXdQmXQAcffTR69ynUCjEdddd1/fFAEXXk9/xiIjp06f3cSXAhtCvId30a0gPPRvSS78urUyhUCgkXQTV7eCDD17jfYVCIZ577rmYNWtW5PP5ElYFFEtNTU3sueeeMWjQoLXu98tf/rI0BQHrRb+GdNOvIT30bEgv/bq0BOeUpXfeeSduvPHGmD59esyaNSsmT54cP/7xj5MuC1gPNTU18cc//jF22GGHpEsBiky/hvTQryHd9GxIB/26tMxxTtnI5/Nx3333xaGHHhqbbrpp3HPPPfGNb3wj5syZo6EDQJnQrwGgMujZABvGHOeUhSVLlsRWW20V9fX1MWXKlLjoootis802S7osAKAL/RoAKoOeDbDhjDinbGSz2chkMlEoFMIMQgBQnvRrAKgMejbAhhGcUxY22mij+Mc//hE//vGP46WXXoptttkmPv3pT8ctt9wSLS0tSZcHbICjjjoqBg8enHQZQBHo15Be+jWki54N6aRfl5bFQSlLCxYsiBtvvDGuvfZaC5dAhdtiiy3WOcKlUCjEa6+9VpqCgKLRryE99GtINz0b0kG/Li3BOYk76KCD1nhfJpOJ5557Lv7xj39EPp8vYVVAsVx66aVrvO+tt96Km266KWbNmuV3HMqcfg3ppl9DeujZkF76dWlZHJTEbbzxxmu9WjZx4sQSVgMU2ymnnNLt546Ojrj33ntj+vTpcf/998eee+4ZP/jBDxKqDugp/RrSTb+G9NCzIb3069Iy4hyAkvjrX/8a1157bdx4443Rr1+/OProo+Ooo46KTTbZJOnSAID/o18DQPnTr0vDiHMSd/TRR69zn0KhENddd13fFwP0iXfffTe23Xbb+MQnPhG33nprfOITn0i6JKCX9GtIP/0a0kHPhnTTr0snm3QBsGjRos7bm2++GTfeeGO3bfPmzYvrr78+6TKBDdDU1BSTJ0+Op556Ks4666y4/vrrY/ny5UmXBfSCfg3pp19DOujZkG76demYqoWyMnPmzNh+++1j8eLFndvefvvtGDlyZHR0dCRYGVAMzc3NcdNNN8U111wTr776ahx++OHxpS99KXbdddekSwN6Qb+GdNOvIT30bEgv/brvGXFOWamtrY329vZu21pbW6OmpiahioBiGjBgQJxwwgnxzDPPxG9/+9tobGyMz372s7HtttsmXRrQC/o1pJt+DemhZ0N66dd9zxznlJXRo0dHe3t7PPXUU/Ev//IvERHx2GOPxZgxYxKuDFhfG2+8cazpy02ZTCba29vj5ZdfLnFVwIbQryF99GtIJz0b0kW/Li3BOWWlpqYmDjzwwPjsZz8bn//852P58uVx0003xYknnph0acB6uuSSS5IuASgy/RrSR7+GdNKzIV3069IyxzllZ/78+XHKKafEgw8+GHV1dXHggQfGBRdcEE1NTUmXBgD8H/0aACqDng2wfgTnAAAAAADQhalaSNw555wTn/vc59a4eMH06dNj5513ju23377ElQHFsMUWW6xxDraVCoVCvPbaa6UpCFgv+jWkm34N6aFnQ3rp16VlxDmJq6mpiSFDhsTDDz+82sb+ta99LebNmxc333xzAtUBG+rSSy/t/O/58+fHBRdcEOeff37ntiVLlsS3vvWtyOfzSZQH9JB+DemmX0N66NmQXvp1aQnOSVxNTU184QtfiN/85jfx0EMPxTbbbNPt/sceeyy+8IUvxKxZsxKqECiWv//977HDDjvE4sWLO7fNmzcvRo4cqbFDmdOvoXro11DZ9GyoDvp138smXQBERFxwwQVx9NFHx1577RUvvfRSt/vGjBkT8+fPT6gyoJiampqipaUlOjo6OrctWbIkGhsbE6wK6Cn9GqqDfg2VT8+G9NOv+57gnLIxbdq0+PKXvxx77bVXPPHEE53bH3/88Rg3blyClQHFMnLkyMjlcnHDDTd0bps+fXpsscUWCVYF9IZ+DemnX0M66NmQbvp137M4KGXl3HPPjcbGxpg4cWIceuihMXDgwJg+fXpMmzYt6dKAIjnppJPimGOOiR/+8IexYsWKeOWVV+LKK69MuiygF/RrSD/9GtJBz4Z006/7ljnOSdwWW2wRTz31VAwdOrRz20MPPRRXXnllLFiwIA4++OA48cQTE6wQKLarr746Hnzwwairq4sDDzwwDj300KRLAtZBv4bqo19DZdKzobro131HcA4AAAAAAF2Y4xyAPjVx4sS45ZZb1nj/aaedFnfccUcJKwIA3k+/BoDyp1+XluAcgD7129/+No466qg1NvdNNtkkrrjiihJXBQB0pV8DQPnTr0tLcA5An7v00kvj2GOPjdtuu22V+yZOnBjPP/986YsCALrRrwGg/OnXpVObdAEApN9BBx0Um2yySRxxxBGRz+fjiCOO6Lxv0KBB0dLSkmB1AECEfg0AlUC/Lh0jzgEoif333z9+8YtfxJe//OW44IILYuXa1Ndee21su+22CVcHAETo1wBQCfTr0sgUVr6yANAHampq4s0334wRI0ZERMTDDz8chx12WDQ1NUX//v3jlVdeibvvvjsmTZqUcKUAUL30awAof/p1aZmqBYA+ddRRR0VjY2PnzxMnToyXX345fvazn8WCBQti//33jx122CHBCgEA/RoAyp9+XVpGnAMAAAAAQBfmOAcAAAAAgC4E5wAAAAAA0IXgHAAAAAAAuhCcAwAAAABAF4JzAAAAAADoQnAOAAAAAABdCM4BAAAAAKALwTkAAAAAAHQhOAcAAAAAgC4E5wAAAAAA0IXgHAAAAAAAuvj/Adc3c9Tq2I94AAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"methods_pruned = [method for method in methods if method != 'HF']\n",
"bases_pruned = ['aug-cc-pVTZ', 'aug-cc-pVQZ', 'aug-cc-pV[34]Z']\n",
"fig, panes = plt.subplots(nrows=1, ncols=len(bases_pruned), sharey=True, figsize=(18, 6))\n",
"\n",
"for pane in range(len(bases_pruned)):\n",
" data = []\n",
" for method in methods_pruned:\n",
" data.append(\n",
" pymolpro.database.analyse(results[method][bases_pruned[pane]],\n",
" db,'kJ/mol')['reaction energy deviations'].to_numpy()[:, 0]\n",
" )\n",
" panes[pane].violinplot(data, showmeans=True, showextrema=True, vert=True, bw_method='silverman')\n",
" panes[pane].set_xticks(range(1, len(methods_pruned) + 1), labels=methods_pruned, rotation=-90)\n",
" panes[pane].set_title(bases_pruned[pane])\n",
"panes[0].set_ylabel('Error / kJ/mol')\n",
"plt.savefig(project_name + \".violin.pdf\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-02T07:01:12.847693Z",
"start_time": "2023-05-02T07:01:12.843041Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"'\\\\begin{tabular}{lrrrrr}\\n\\\\toprule\\n & DF-LMP2/aug-cc-pVDZ & DF-LMP2/aug-cc-pVTZ & DF-LMP2/aug-cc-pVQZ & DF-LMP2/aug-cc-pV[23]Z & DF-LMP2/aug-cc-pV[34]Z \\\\\\\\\\n\\\\midrule\\nMAD & 1.43 & 4.05 & 0.54 & 4.86 & 2.24 \\\\\\\\\\nMAXD & 2.23 & 10.63 & 0.79 & 13.76 & 6.46 \\\\\\\\\\nRMSD & 1.64 & 6.18 & 0.58 & 7.95 & 3.73 \\\\\\\\\\nMSD & -1.21 & -4.05 & -0.54 & -4.86 & 2.07 \\\\\\\\\\nSTDEVD & 1.36 & 5.71 & 0.26 & 7.71 & 3.81 \\\\\\\\\\n\\\\bottomrule\\n\\\\end{tabular}\\n'"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"basis_errors.to_latex(float_format='%.2f')"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2023-05-02T07:08:32.683913Z",
"start_time": "2023-05-02T07:08:32.681098Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\\begin{tabular}{lrrrrr}\n",
"\\toprule\n",
" & DF-LMP2/aug-cc-pVDZ & DF-LMP2/aug-cc-pVTZ & DF-LMP2/aug-cc-pVQZ & DF-LMP2/aug-cc-pV[23]Z & DF-LMP2/aug-cc-pV[34]Z \\\\\n",
"\\midrule\n",
"MAD & 1.435 & 4.047 & 0.539 & 4.857 & 2.239 \\\\\n",
"MAXD & 2.228 & 10.627 & 0.793 & 13.761 & 6.464 \\\\\n",
"RMSD & 1.642 & 6.175 & 0.580 & 7.952 & 3.734 \\\\\n",
"MSD & -1.207 & -4.047 & -0.539 & -4.857 & 2.071 \\\\\n",
"STDEVD & 1.364 & 5.712 & 0.262 & 7.712 & 3.805 \\\\\n",
"\\bottomrule\n",
"\\end{tabular}\n",
"\n"
]
}
],
"source": [
"print(basis_errors.style.format(precision=3).to_latex(hrules=True,multicol_align='c'))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.7"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}